package net.hands.common.ado.query;

import java.util.Collection;
import java.util.LinkedHashSet;

import net.hands.common.logger.Log;
import net.hands.common.logger.LogFactory;

/**
 * 说明:抽象数据查询类 <br>
 * <p>
 * 这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。
 * </p>
 * 
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public abstract class AbstractDataQuery<E> implements IDataQuery<E> {
	/**
	 * 当前索引
	 */
	protected int i;
	/**
	 * 总数
	 */
	protected int count;

	/**
	 * 
	 * Constructor Method
	 * 
	 * @update 2012-9-19 下午12:26:23
	 */
	public AbstractDataQuery() {
		// 重置索引和总数
		reset();

	}

	/**
	 * 
	 (non-Javadoc)
	 * 
	 * @see net.hands.common.ado.query.IDataQuery#position()
	 * @update 2012-9-19 下午12:26:35
	 */
	@Override
	public int position() {
		return i;
	}

	@Override
	public void remove() {
		// TODO Auto-generated method stub

	}

	/**
	 * 
	 (non-Javadoc)
	 * 
	 * @see net.hands.common.ado.query.IDataQuery#reset()
	 * @update 2012-9-19 下午12:28:58
	 */
	@Override
	public void reset() {
		i = 0;// 当前索引归为0
		count = getCount();// 总数归为0
	}

	/**
	 * 
	 (non-Javadoc)
	 * 
	 * @see net.hands.common.ado.query.IDataQuery#setCount(int)
	 * @update 2012-9-19 下午12:30:08
	 */
	@Override
	public void setCount(final int count) {
		this.count = count;
	}

	/**
	 * 
	 (non-Javadoc)
	 * 
	 * @see net.hands.common.ado.query.IDataQuery#close()
	 * @update 2012-9-19 下午12:30:18
	 */
	@Override
	public void close() {
	}

	/**
	 * 数据查询监听器集合
	 */
	private Collection<IDataQueryListener> listeners;

	/**
	 * 
	 (non-Javadoc)
	 * 
	 * @see net.hands.common.ado.query.IDataQuery#getListeners()
	 * @update 2012-9-19 下午12:30:44
	 */
	@Override
	public Collection<IDataQueryListener> getListeners() {
		if (listeners == null) {
			listeners = new LinkedHashSet<IDataQueryListener>();
		}
		return listeners;
	}

	/**
	 * 
	 (non-Javadoc)
	 * 
	 * @see net.hands.common.ado.query.IDataQuery#addListener(net.hands.common.ado.query.IDataQueryListener)
	 * @update 2012-9-19 下午12:30:54
	 */
	@Override
	public void addListener(final IDataQueryListener listener) {
		getListeners().add(listener);
	}

	/**
	 * 
	 (non-Javadoc)
	 * 
	 * @see net.hands.common.ado.query.IDataQuery#removeListener(net.hands.common.ado.query.IDataQueryListener)
	 * @update 2012-9-19 下午12:31:04
	 */
	@Override
	public boolean removeListener(final IDataQueryListener listener) {
		return getListeners().remove(listener);
	}

	protected final Log log = LogFactory.getLogger(getClass());
}
